package com.virtualperson.util;

import com.virtualperson.exception.ImageValidationException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class PromptValidationUtil {
    private static final int MAX_PROMPT_LENGTH = 100;
    
    // 面部关键词（中英文）
    private static final Set<String> FACE_KEYWORDS = new HashSet<>(Arrays.asList(
        "face", "facial", "五官", "面部", "脸", "表情", "眼睛", "眼神", "鼻子", "嘴巴", "嘴唇",
        "微笑", "笑容", "轮廓", "皮肤", "肤色", "眉毛", "眼睛", "眼神", "睫毛", "头发",
        "发型", "发型", "发型", "发型", "发型", "发型", "发型", "发型", "发型", "发型"
    ));

    /**
     * 验证提示词
     * @param prompt 提示词
     * @param fieldName 字段名称（用于错误提示）
     * @throws ImageValidationException 验证失败异常
     */
    public static void validatePrompt(String prompt, String fieldName) throws ImageValidationException {
        if (prompt == null || prompt.trim().isEmpty()) {
            throw new ImageValidationException(fieldName + "不能为空");
        }

        // 去除首尾空格后计算长度
        String trimmedPrompt = prompt.trim();
        if (trimmedPrompt.length() > MAX_PROMPT_LENGTH) {
            throw new ImageValidationException(fieldName + "长度不能超过" + MAX_PROMPT_LENGTH + "个字符");
        }

        // 检查是否包含有效字符（至少包含一个非空白字符）
        if (trimmedPrompt.replaceAll("\\s+", "").isEmpty()) {
            throw new ImageValidationException(fieldName + "不能只包含空白字符");
        }

        // 检查是否包含特殊字符
        if (containsInvalidCharacters(trimmedPrompt)) {
            throw new ImageValidationException(fieldName + "包含无效的特殊字符");
        }

        // 如果是face_prompt，进行额外的验证
        if ("face_prompt".equals(fieldName)) {
            validateFacePrompt(trimmedPrompt);
        }
    }

    /**
     * 验证face_prompt
     * @param prompt face_prompt内容
     * @throws ImageValidationException 验证失败异常
     */
    private static void validateFacePrompt(String prompt) throws ImageValidationException {
        // 转换为小写以进行不区分大小写的匹配
        String lowerPrompt = prompt.toLowerCase();
        
        // 检查是否包含面部相关关键词
        boolean containsFaceKeyword = FACE_KEYWORDS.stream()
            .anyMatch(keyword -> lowerPrompt.contains(keyword.toLowerCase()));
            
        if (!containsFaceKeyword) {
            throw new ImageValidationException("face_prompt必须包含面部相关的描述，如：五官、表情、眼神等");
        }

        // 检查是否过于简单
        if (prompt.length() < 5) {
            throw new ImageValidationException("face_prompt描述过于简单，请提供更详细的面部描述");
        }

        // 检查是否包含不适当的内容（可选）
        if (containsInappropriateContent(prompt)) {
            throw new ImageValidationException("face_prompt包含不适当的内容");
        }
    }

    /**
     * 检查是否包含无效的特殊字符
     */
    private static boolean containsInvalidCharacters(String prompt) {
        // 检查是否包含控制字符
        for (char c : prompt.toCharArray()) {
            if (Character.isISOControl(c)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 检查是否包含不适当的内容
     * 这里只是示例，您可以根据实际需求定义哪些内容是不适当的
     */
    private static boolean containsInappropriateContent(String prompt) {
        // 这里可以添加敏感词过滤等逻辑
        // 示例：检查是否包含过于简单或模糊的描述
        String[] vagueTerms = {"好看", "漂亮", "美丽", "beautiful", "pretty", "good"};
        String lowerPrompt = prompt.toLowerCase();
        return Arrays.stream(vagueTerms)
            .anyMatch(term -> lowerPrompt.equals(term.toLowerCase()));
    }
} 